package com.ruoyi.web.controller.common;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MinIoFileUploader;
import com.ruoyi.common.utils.file.FtpUtil;
import io.minio.MinioClient;
import io.minio.errors.*;
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
import net.sf.jsqlparser.expression.DateTimeLiteralExpression.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.Global;
import com.ruoyi.common.config.ServerConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * 通用请求处理
 *
 * @author ruoyi
 */
@Controller
public class CommonController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
    @Value("${FTP.ADDRESS}")
    private String host;
    /**
     * 端口
     */

    @Value("${FTP.PORT}")
    private int port;
    /**
     * ftp用户名
     */

    @Value("${FTP.USERNAME}")
    private String userName;
    /**
     * ftp用户密码
     */

    @Value("${FTP.PASSWORD}")
    private String passWord;
    /**
     * 文件在服务器端保存的主目录
     */

    @Value("${FTP.BASEPATH}")
    private String basePath;
    /**
     * 访问图片时的基础url
     */
    @Value("${IMAGE.BASE.URL}")
    private String baseUrl;

    @Autowired
    private ServerConfig serverConfig;

    /**
     * 通用下载请求
     *
     * @param fileName 文件名称
     * @param delete   是否删除
     */
    @GetMapping("common/download")
    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {
        try {
            if (!FileUtils.isValidFilename(fileName)) {
                throw new Exception(StringUtils.format("文件名称({})非法，不允许下载。 ", fileName));
            }
            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
            String filePath = Global.getDownloadPath() + fileName;

            response.setCharacterEncoding("utf-8");
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition",
                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
            FileUtils.writeBytes(filePath, response.getOutputStream());
            if (delete) {
                FileUtils.deleteFile(filePath);
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
    /**
     * tongui
     *
     * @param fileName 文件名称
     *
     */
    @GetMapping("common/getFile/{fileName}")
    public void getFile(@PathVariable("fileName") String fileName, HttpServletResponse response, HttpServletRequest request) throws Exception {
        MinioClient minioClient = new MinioClient("http://121.199.76.161:9000", "minioadmin", "minioadmin");
        InputStream shop = minioClient.getObject("shop", fileName);

        byte[] b = new byte[shop.available()];
        shop.read(b);

        response.reset();
        // 设置response的Header
        response.addHeader("Content-Length", "" + shop.available());
        response.setContentType("image/*");
        OutputStream outputStream = response.getOutputStream();
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        bufferedOutputStream.write(b);
        bufferedOutputStream.flush();
        shop.close();
        bufferedOutputStream.close();
    }

    /**
     * 通用上传请求 type 0 上传项目怒路 ，type 1 上传ftp服务器
     */
    @PostMapping("/common/upload")
    @ResponseBody
    public AjaxResult uploadFile(MultipartFile file, String type) throws Exception {
        if ("0".equals(type)) {
            try {
                // 上传文件路径
                String filePath = Global.getUploadPath();
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                AjaxResult ajax = AjaxResult.success();
                ajax.put("fileName", fileName);
                ajax.put("url", url);
                return ajax;
            } catch (Exception e) {
                return AjaxResult.error(e.getMessage());
            }
        } else if ("1".equals(type)) {
            //1、给上传的图片生成新的文件名
            //1.1获取原始文件名
            String oldName = file.getOriginalFilename();
            //1.2使用IDUtils工具类生成新的文件名，新文件名 = newName + 文件后缀
            String newName = String.valueOf(System.currentTimeMillis());
            newName = newName + oldName.substring(oldName.lastIndexOf("."));
            //1.3生成文件在服务器端存储的子目录
            String filePath = DateUtils.datePath();
            InputStream input = file.getInputStream();
            //3.2调用FtpUtil工具类进行上传
            boolean result = FtpUtil.uploadFile(host, port, userName, passWord, basePath, filePath, newName, input);
            if (result) {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("fileName", newName);
                ajax.put("url", baseUrl +"/"+ filePath+"/" + newName);
                return ajax;
            } else {
                return AjaxResult.error("上传失败");
            }
        }else if ("3".equals(type)) {
            String oldName = file.getOriginalFilename();
            String newName = String.valueOf(System.currentTimeMillis());
            newName = newName + oldName.substring(oldName.lastIndexOf("."));
            String upload = MinIoFileUploader.fileUpload(newName, file);
            if (upload!="") {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("fileName", newName);
                ajax.put("url", upload);
                return ajax;
            } else {
                return AjaxResult.error("上传失败");
            }
        }
        return null;
    }

    /**
     * 本地资源通用下载
     */
    @GetMapping("/common/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // 本地资源路径
        String localPath = Global.getProfile();
        // 数据库资源地址
        String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
        // 下载名称
        String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
        FileUtils.writeBytes(downloadPath, response.getOutputStream());
    }
}
